package com.app.system.utils.dataType;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * Created by wsb on 2017/10/25.
 */
public class BigDecimalUtils {

    /**
     * 处理空值(BigDecimal)
     *
     * @param value
     * @return
     */
    public static BigDecimal getNotNull(BigDecimal value) {
        return value == null ? BigDecimal.ZERO : value;
    }

    /**
     * string转Big类型
     *
     * @param value
     * @return
     */
    public static BigDecimal stringToBigDecimal(String value) {
        if (StringUtils.isNotEmpty(value)) {
            try {
                return new BigDecimal(value);
            } catch (Exception e) {
                return BigDecimal.ZERO;
            }
        } else {
            return BigDecimal.ZERO;
        }
    }

    /**
     * 处理空值(BigDecimal)
     *
     * @param value
     * @return
     */
    public static String getNotNullStr(BigDecimal value) {
        DecimalFormat df2 = new DecimalFormat("0.##");
        return (value == null || value.compareTo(BigDecimal.ZERO) == 0) ? "" : df2.format(value);
    }

    /**
     * 处理空值(BigDecimal)
     *
     * @param value
     * @return
     */
    public static String getNotNullText(BigDecimal value) {
        DecimalFormat df2 = new DecimalFormat("0.##");
        return (value == null || value.compareTo(BigDecimal.ZERO) == 0) ? "/" : df2.format(value);
    }

    /**
     * 计算求和
     *
     * @param values
     * @return
     */
    public static BigDecimal getSum(BigDecimal... values) {
        BigDecimal result = new BigDecimal("0");
        if (values != null && values.length > 0) {
            for (BigDecimal v : values) {
                result = result.add(getNotNull(v));
            }
        }
        return result;
    }

    /**
     * 计算求和
     *
     * @param values
     * @return
     */
    public static BigDecimal getSumForInt(BigDecimal... values) {
        BigDecimal result = new BigDecimal("0");
        if (values != null && values.length > 0) {
            for (BigDecimal v : values) {
                result = result.add(getNotNull(v));
            }
        }
        return result.setScale(0, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 计算差
     *
     * @param b1
     * @param b2
     * @return
     */
    public static BigDecimal getBigAndBigSub(BigDecimal b1, BigDecimal b2) {
        return getNotNull(b1).subtract(getNotNull(b2));
    }

    /**
     * 计算除法
     *
     * @param b1
     * @param b2
     * @return
     */
    public static BigDecimal getBigAndBigDiv(BigDecimal b1, BigDecimal b2, Integer scale) {
        BigDecimal result = new BigDecimal("0");
        b1 = getNotNull(b1);
        b2 = getNotNull(b2);
        if (b2.compareTo(BigDecimal.ZERO) > 0) {
            result = b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP);
        }
        return result;
    }

    /**
     * 计算bigDecimal*integer数值
     *
     * @param b
     * @param i
     * @return
     */
    public static BigDecimal getBigAndIntMul(BigDecimal b, Integer i) {
        return getNotNull(b).multiply(new BigDecimal(IntegerUtils.getNotNull(i)));
    }

    /**
     * 计算bigDecimal*bigDecimal数值
     *
     * @param b1
     * @param b2
     * @return
     */
    public static BigDecimal getBigAndBigMul(BigDecimal b1, BigDecimal b2) {
        return getNotNull(b1).multiply(getNotNull(b2));
    }

    /**
     * 比较两个值的大小，返回较大的那个值
     *
     * @param b1
     * @param b2
     * @return
     */
    public static BigDecimal getMaxBig(BigDecimal b1, BigDecimal b2) {
        return getNotNull(b1).compareTo(getNotNull(b2)) < 1 ? getNotNull(b2) : getNotNull(b1);
    }

    /**
     * 返回一个数字的相反数
     *
     * @param b
     * @return
     */
    public static BigDecimal getNegateBig(BigDecimal b) {
        return getNotNull(b).negate();
    }

    /**
     * 返回一个数字的绝对值
     *
     * @param b
     * @return
     */
    public static BigDecimal getAbsolute(BigDecimal b) {
        BigDecimalUtils.getNotNull(b);
        return getNotNull(b).abs();
    }

    /**
     * 数值相除得到%
     *
     * @param numerator   分子
     * @param denominator 分母
     * @return
     */
    public static String getPercentBigDecimal(int numerator, int denominator) {
        if (numerator > 0 && denominator > 0) {
            return getBigAndBigDiv(getBigAndBigMul(new BigDecimal(numerator), new BigDecimal("100")), new BigDecimal(denominator), 2).toString() + "%";
        } else {
            return "";
        }
    }

    /**
     * 契税专用，计算当前房屋各面积占比多少
     * 数值相除得到%
     *
     * @param numerator   分子
     * @param denominator 分母
     * @return
     */
    public static String getBigPercentBigDecimal(BigDecimal numerator, BigDecimal denominator) {
        numerator = numerator == null ? BigDecimal.ZERO : numerator;
        denominator = denominator == null ? BigDecimal.ZERO : denominator;
        if (numerator.compareTo(new BigDecimal(0)) > 0 && denominator.compareTo(new BigDecimal(0)) > 0) {
            return getBigAndBigDiv(getBigAndBigMul(numerator, new BigDecimal("100")), denominator, 10).toString() + "%";
        } else {
            return "0";
        }
    }

    /**
     * 契税专用，计算当前房屋各面积占比多少，计算出面积
     *
     * @param b
     * @return
     */
    public static String getTaxArea(BigDecimal a, BigDecimal b, BigDecimal c) {
        BigDecimal taxArea = BigDecimalUtils.getBigAndBigMul(a, BigDecimalUtils.getBigAndBigDiv(b, c, 12)).setScale(4, BigDecimal.ROUND_HALF_UP);

        System.out.println(BigDecimalUtils.getNotNull(taxArea).toString());
        return BigDecimalUtils.getNotNull(taxArea).toString();
    }
}
